import {config} from '/common/config.js'
import {Tool} from '/common/tool.js'
import store from '/store/index.js'

const baseUrl = config.baseUrl;


export class Request {

    /**
     * 封装uni.request
     * @param {string} url - 请求的 URL
     * @param {string} method - 请求方法 (GET, POST, DELETE, PUT)
     * @param {Object} data - 请求的数据 (POST/PUT 数据)
     * @param {Object} params - 请求参数 (GET/DELETE 参数)
     * @param {Object} headers - 请求头
     * @returns {Promise} - 返回一个 Promise
     */
    request({url, method, data = {}, params = {}, headers = {}}) {
        return new Promise((resolve, reject) => {
            // 拼接 GET/DELETE 参数到 URL
            if ((method === 'GET' || method === 'DELETE') && Object.keys(params).length > 0) {
                const queryString = Object.keys(params)
                    .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
                    .join('&');
                url += `?${queryString}`;
            }
            uni.request({
                url: `${baseUrl}${url}`,
                method,
                data,
                header: {
                    //设置token
                    "X-Access-Token": new Tool().getToken(),
                    'Content-Type': 'application/json',
                    ...headers,
                },
                success: (response) => {
                    if (response.statusCode === 200) {
                        if (response.data.code === 1) {
                            resolve(response.data.data);
                        } else {
                            if(response.data.code === 401){
                                //登录失效-清楚登录信息
                                uni.clearStorage();
                                //清楚vuex的数据
                                store.commit("setUserInfo", null); // 更新用户信息
                            }else{
                                new Tool().errMsg()
                            }
                            console.log("Request failed" + response)
                            uni.$u.toast(response.data.msg)
                            reject({message: 'Request failed', response});
                        }
                    } else {
                        console.log("Request failed" + response)
                        reject({message: 'Request failed', response});
                    }
                },
                fail: (error) => {
                    console.log("Network error" + error)
                    new Tool().errMsg();
                    reject({message: 'Network error', error});
                },
            });
        });
    }

    /**
     * GET 请求
     * @param {string} url - 请求的 URL
     * @param {Object} params - 请求参数
     * @param {Object} headers - 请求头
     * @returns {Promise}
     */
    get(url, params = {}, headers = {}) {
        return this.request({url, method: 'GET', params, headers});
    }

    /**
     * POST 请求
     * @param {string} url - 请求的 URL
     * @param {Object} data - 请求的数据
     * @param {Object} headers - 请求头
     * @returns {Promise}
     */
    post(url, data = {}, headers = {}) {
        return this.request({url, method: 'POST', data, headers});
    }

    /**
     * DELETE 请求
     * @param {string} url - 请求的 URL
     * @param {Object} params - 请求参数
     * @param {Object} headers - 请求头
     * @returns {Promise}
     */
    del(url, params = {}, headers = {}) {
        return this.request({url, method: 'DELETE', params, headers});
    }

    /**
     * PUT 请求
     * @param {string} url - 请求的 URL
     * @param {Object} data - 请求的数据
     * @param {Object} headers - 请求头
     * @returns {Promise}
     */
    put(url, data = {}, headers = {}) {
        return this.request({url, method: 'PUT', data, headers});
    }

    /**
     * 上传文件
     * @param {string} url - 上传的接口地址
     * @param {string} filePath - 本地文件路径
     * @param {string} fileName - 文件对应的字段名，默认 'file'
     * @param {Object} formData - 额外携带的表单数据
     * @param {Object} headers - 请求头
     * @returns {Promise}
     */
    uploadFile(url, filePath, fileName = 'file', formData = {}, headers = {}) {
        return new Promise((resolve, reject) => {
            uni.uploadFile({
                url: `${baseUrl}${url}`, // 拼接 baseUrl 和接口路径
                filePath, // 本地文件路径
                name: fileName, // 文件对应的字段名
                formData, // 携带的表单数据
                header: {
                    "X-Access-Token": new Tool().getToken(), // 设置 token
                    ...headers,
                },
                success: (response) => {
                    if (response.statusCode === 200) {
                        resolve(JSON.parse(response.data)); // 返回解析后的数据
                    } else {
                        console.log(response)
                        reject({message: 'Upload failed', response});
                    }
                },
                fail: (error) => {
                    console.log(error)
                    reject({message: 'Network error', error});
                },
            });
        });
    }

}
